Don't fail for EPERM when hardlinking
authorGiovanni Campagna <gcampagna@src.gnome.org>
Mon, 20 Aug 2012 20:32:17 +0000 (22:32 +0200)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Mon, 20 Aug 2012 21:01:57 +0000 (23:01 +0200)
As the manual page doesn't say, but the in-code kernel documentation
shows, hardlinking for normal users can fail for a variety of
reasons (including very common situations such as non regular file
or non writable file), if the owner of the file does not match
the user linking (e.g. when checking out a shadow repo with a root-
owned master).
If that happens, fail back silently to copying instead of aborting
the whole operation.

https://bugzilla.gnome.org/show_bug.cgi?id=682298

src/libostree/ostree-repo.c

index 887811310b7e1494cb3c030fc5a9080f3bd7faa7..200a790e07a1a3578da67adb82711bbf9046767b 100644 (file)
@@ -4125,9 +4125,9 @@ checkout_file_hardlink (OstreeRepo                  *self,
 
   if (link (ot_gfile_get_path_cached (source), ot_gfile_get_path_cached (destination)) != -1)
     ret_was_supported = TRUE;
-  else if (errno == EMLINK || errno == EXDEV)
+  else if (errno == EMLINK || errno == EXDEV || errno == EPERM)
     {
-      /* EMLINK and EXDEV shouldn't be fatal; we just can't do the
+      /* EMLINK, EXDEV and EPERM shouldn't be fatal; we just can't do the
        * optimization of hardlinking instead of copying.
        */
       ret_was_supported = FALSE;